package org.example.controller;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import org.example.dao.ClassDao;
import org.example.dao.StudentDao;
import org.example.model.ClassInfo;
import org.example.model.PageBean;
import org.example.utils.DbUtil;
import org.example.utils.JsonUtil;
import org.example.utils.ResponseUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;

/*
    class/classList  查询Get
    class/updateClass 修改post方法
    class/deleteClass 删除delete方法post方法
    class/insertClass 新整post方法
    模糊匹配路径/目录匹配
 */
@WebServlet(urlPatterns = "/class/*")
public class ClassServlet extends HttpServlet {
        DbUtil dbUtil = new DbUtil();
        ClassDao classDao = new ClassDao();
        StudentDao studentDao=new StudentDao();
//    ctrl+i  当类有实现的关系能够快速实现抽象接口方法
//    ctrl+O 重写方法快捷键

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //ctrl+Y  删除改行
        //当前端发过来的一个class/classList请求的时候
        //实际需要获取classList这个路径
        /*通过HttpServerletRequest
        获取请求地址 locallhost:8080/servletdemo/class/classList
        处理这个长url  截取最后一个/开头的参数作为我们的实际业务
         */
//        System.out.println(req.getRequestURI());
        req.setCharacterEncoding("utf-8");
        String requestURI = req.getRequestURI();
        System.out.println("请求地址："+requestURI);

        //2.截取这个地址最后一个
        //使用lastIndexof获取最后一个下标位置
        int lastIndexOf=requestURI.lastIndexOf("/");
        //查询参数标志，存在返回实际的下标
        //不存在返回-1


        /*
        *   这里步骤Servlet会帮我们做
         */
        int queryFlag = requestURI.indexOf("?");
        if(queryFlag!=-1){
            //需要固定范围截取 /(lastIndexOf+1) 到  ? queryFlag结束
            requestURI = requestURI.substring(lastIndexOf+1,queryFlag);
        }else{
            //否则就按开始范围截取
            requestURI = requestURI.substring(lastIndexOf+1);
        }
        //从这个最后一个位置往后截取
        //当我么使用查询参数时，class/classList?username=user01&password=123
        // 避免使用get请求查询参数时无法匹配到业务的bug
        /*
        1.判断?是否存在，
            如果存在，截取范围需要固定，固定开始范围和结束范围
            不存在，按照原方式直接截取
         */
//        requestURI=requestURI.substring(lastIndexOf+1);

        System.out.println("截取后的请求："+requestURI);
        /*
            RequestURL
            对于业务分发，使用SwitchCase  策略模式分发我们的业务
         */
        switch (requestURI) {
            //匹配查询业务。。。。
            case "classList":{
                getClassList(req, resp);
                break;
            }
            case "classSave":{
                insertClass(req,resp);
                break;
            }
            //删除请求，并且需要支持批量删除
                /*
                    参数delIds
                 */
            case "classDelete":{
                deleteClass(req,resp);

                break;
            }

        }
    }

    private void deleteClass(HttpServletRequest req, HttpServletResponse resp) {
        //1.支持批量删除，利用分隔符 分隔参数为数组
        String delIds=req.getParameter("delIds");
        JSONObject result=new JSONObject();
        if (delIds==null) {
            result.put("errorMsg", "删除班级ID不能为空");
            result.put("success", false);
            try {
                ResponseUtil.write(resp,result);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
            return;
        }

        //2.删除班级的时候 需要检查班级是否分配了学生
        Connection con=null;
        try {
            con=dbUtil.getCon();
            //通过逗号分隔符
            String[] ids=delIds.split(",");
            //拿到班级信息表查看t_class是否有学生
            for (String id : ids) {
                //通过查询学生表关联的学生信息
               boolean flag= studentDao.getStudentByClassId(con,id);
               if(flag){

                   result.put("success",false);
                   result.put("errorMsg","班级下面有学生，不可删除");
                   ResponseUtil.write(resp,result);
                   return ;
               }
            }
            //由于我们sql语句使用In语句，数据格式已经好了，直接传入
            int delNums=classDao.deleteClass(con,delIds);
            if(delNums>0){
                result.put("success",true);
                result.put("delNums",delNums);
            }else{
                result.put("success",false);
                result.put("errorMsg","操作失败");
            }
            ResponseUtil.write(resp,result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            dbUtil.closecon(con);
        }

        //3.没有检查到学生，就安全删除，否则，需要提示用户不可删除班级

        //3.1 返回信息给前端，通知前端删除结果
    }

    private void insertClass(HttpServletRequest req, HttpServletResponse resp) {
        //1.接收请求发过来的参数
        String className=req.getParameter("className");
        String classDesc=req.getParameter("classDesc");
        //目前这个新增接口 需要承接二个功能  一个新增  一个修改
        String classId=req.getParameter("id");
        //封装实体
        ClassInfo classInfo=new ClassInfo();
        classInfo.setClassName(className);
        classInfo.setClassDesc(classDesc);
        //3.获取数据库连接
        Connection conn=null;
        try {
            conn=dbUtil.getCon();
            int saveNum=0;
            JSONObject result=new JSONObject();
            if(classId==null){
                //需要新增班级信息
                saveNum=classDao.insertClass(conn,classInfo);
            }else{
                //需要修改班级信息
                classInfo.setId(Integer.parseInt(classId));
                saveNum=classDao.updateClass(conn,classInfo);
            }
            //如果执行的结构大于0，拆入的数据或者修改了数据，就说明修改或者新增成功
            if(saveNum>0){
                result.put("success",true);
            }else{
                result.put("success",false);
                result.put("errorMsg","操作失败");
            }
            ResponseUtil.write(resp,result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            dbUtil.closecon(conn);
        }
    }

    private void getClassList(HttpServletRequest req, HttpServletResponse resp) {
        //查询业务代码....
                /*
                    1.获取到查询参数
                    page 当前页 row 每页多少条数据
                    2.封装查询实体
                    把参数封装到实体中给到dao持久层做条件/分页查询

                 */
        //1.获取分页参数
        String page= req.getParameter("page");
        String rows= req.getParameter("rows");

        //获取查询参数
        String className=req.getParameter("className");


        //2.封装实体
        //封装班级实体
        ClassInfo classInfo=new ClassInfo();
        classInfo.setClassName(className);
        //2.1 把分页参数封装到页面实体中
        PageBean pageBean=new PageBean(Integer.parseInt(page),
                Integer.parseInt(rows));

        //3.真正查询
        //3.1 实例化Dbutil,实例化Dao
        //3.2 查询
        Connection con=null;
        try {
            con=dbUtil.getCon();
            //1.数据库查询
            //alt+enter
            ResultSet res=classDao.getClassList(con,pageBean,classInfo);
            //2.封装结果集，封装好的数据集，实际的数据
            JSONArray jsonArray=JsonUtil.formatRsToJsonArray(res);
            //告知前端 有多少条数据
            // 3.统计函数有多少数据结果集
            int total=classDao.count(con,null);
            //4.返回页面,封装实体
            JSONObject result=new JSONObject();
            result.put("total",total);
            result.put("rows",jsonArray);

            //5.输出数据给页面
            ResponseUtil.write(resp,result);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }finally {
            dbUtil.closecon(con);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}


